package br.com.vdn.vo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Formula;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Proxy;
import org.hibernate.annotations.Type;

import br.com.util.tipodado.CNPJ;
import br.com.util.tipodado.CPF;
import br.com.util.tipodado.DataHora;
import br.com.util.tipodado.Flag;
import br.com.util.tipodado.InteiroLongo;
import br.com.util.tipodado.Texto;

@Entity
@Table(name="TBCLN")
@Proxy(lazy=true)
public class ClienteVo implements Serializable
{
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "CLNCD")
	@GeneratedValue(generator = "InteiroSequenceGenerator")
	@GenericGenerator(name = "InteiroSequenceGenerator", strategy = "br.com.util.tipodado.hibernate.generator.InteiroSequenceGenerator", parameters = { @Parameter(name = "sequence", value = "SQCLN") })
	@Type(type = "br.com.util.tipodado.hibernate.InteiroLongoUT")
	private InteiroLongo codigo;
	
	@Column(name = "CLNNM")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto nome;
	
	@Column(name = "CLNFGATV")
	@Type(type = "br.com.util.tipodado.hibernate.FlagUT")
	private Flag flagAtivo;

	@Column(name = "CLNTPPSS")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto tipoPessoa;
	
	@Column(name = "CLNCPFCNPJ")
	@Type(type = "br.com.util.tipodado.hibernate.InteiroLongoUT")
	private InteiroLongo cpfCnpj;
	
	@Formula("(CASE WHEN CLNTPPSS = 'F' THEN CLNCPFCNPJ ELSE NULL END)")
	@Type(type = "br.com.util.tipodado.hibernate.CpfUT")
	private CPF cpf;
	
	@Formula("(CASE WHEN CLNTPPSS = 'J' THEN CLNCPFCNPJ ELSE NULL END)")
	@Type(type = "br.com.util.tipodado.hibernate.CnpjUT")
	private CNPJ cnpj;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USRCDINC")
	private UsuarioVo usuarioInclusaoVo;
	
	@Column(name = "USRDTINC")
	@Type(type = "br.com.util.tipodado.hibernate.DataHoraUT")
	private DataHora dataInclusao;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USRCDALT")
	private UsuarioVo usuarioAlteracaoVo;
	
	@Column(name = "USRDTALT")
	@Type(type = "br.com.util.tipodado.hibernate.DataHoraUT")
	private DataHora dataAlteracao;
	
	@Column(name = "CLNEMAIL")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto email;
	
	@Column(name = "CLNINSEST")
	private String clninsest;
	
	@OneToMany(mappedBy="clienteVo", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Set<EnderecoVo> listaEndereco;
	
	@OneToMany(mappedBy="clienteVo", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Set<TelefoneVo> listaTelefone;
	
	@Column(name = "CLNCNT")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto contato;
	
	@Transient
	private InteiroLongo codigoNE;

	public InteiroLongo getCodigo()
	{
		return codigo;
	}

	public void setCodigo(InteiroLongo codigo)
	{
		this.codigo = codigo;
	}

	public Texto getNome()
	{
		return nome;
	}

	public void setNome(Texto nome)
	{
		this.nome = nome;
	}

	public Flag getFlagAtivo()
	{
		return flagAtivo;
	}

	public void setFlagAtivo(Flag flagAtivo)
	{
		this.flagAtivo = flagAtivo;
	}

	public CPF getCpf()
	{
		return cpf;
	}

	public void setCpf(CPF cpf)
	{
		this.cpf = cpf;
	}

	public UsuarioVo getUsuarioInclusaoVo()
	{
		return usuarioInclusaoVo;
	}

	public void setUsuarioInclusaoVo(UsuarioVo usuarioInclusaoVo)
	{
		this.usuarioInclusaoVo = usuarioInclusaoVo;
	}

	public DataHora getDataInclusao()
	{
		return dataInclusao;
	}

	public void setDataInclusao(DataHora dataInclusao)
	{
		this.dataInclusao = dataInclusao;
	}

	public UsuarioVo getUsuarioAlteracaoVo()
	{
		return usuarioAlteracaoVo;
	}

	public void setUsuarioAlteracaoVo(UsuarioVo usuarioAlteracaoVo)
	{
		this.usuarioAlteracaoVo = usuarioAlteracaoVo;
	}

	public DataHora getDataAlteracao()
	{
		return dataAlteracao;
	}

	public void setDataAlteracao(DataHora dataAlteracao)
	{
		this.dataAlteracao = dataAlteracao;
	}

	public InteiroLongo getCpfCnpj()
	{
		return cpfCnpj;
	}

	public void setCpfCnpj(InteiroLongo cpfCnpj)
	{
		this.cpfCnpj = cpfCnpj;
	}

	public CNPJ getCnpj()
	{
		return cnpj;
	}

	public void setCnpj(CNPJ cnpj)
	{
		this.cnpj = cnpj;
	}

	public Texto getTipoPessoa()
	{
		return tipoPessoa;
	}

	public void setTipoPessoa(Texto tipoPessoa)
	{
		this.tipoPessoa = tipoPessoa;
	}

	public Set<EnderecoVo> getListaEndereco()
	{
		return listaEndereco;
	}

	public void setListaEndereco(Set<EnderecoVo> listaEndereco)
	{
		this.listaEndereco = listaEndereco;
	}

	public Set<TelefoneVo> getListaTelefone()
	{
		return listaTelefone;
	}

	public void setListaTelefone(Set<TelefoneVo> listaTelefone)
	{
		this.listaTelefone = listaTelefone;
	}

	public InteiroLongo getCodigoNE()
	{
		return codigoNE;
	}

	public void setCodigoNE(InteiroLongo codigoNE)
	{
		this.codigoNE = codigoNE;
	}

	public Texto getEmail()
	{
		return email;
	}

	public void setEmail(Texto email)
	{
		this.email = email;
	}

	public Texto getContato()
	{
		return contato;
	}

	public void setContato(Texto contato)
	{
		this.contato = contato;
	}

	public String getClninsest() {
		return clninsest;
	}

	public void setClninsest(String clninsest) {
		this.clninsest = clninsest;
	}

}
